今天S.O有一個有趣問題
sql - MySQL select from INT column - Stack
Overflow
為什麼資料int型態的20跟字串型態的"20XXX"比較,答案是True
select (20 = "20XXX") ;
因為MySQL在字串轉型的過程中是寬鬆的
"20XXX"只取開頭取字符,忽略XXX
所以得到的比較字串select (20 = 20)
因為判斷是以開頭字串為準
當開頭不是以數字開頭,答案會是false(0)
select (20 = "XXX20") ;
得到的比較字串select (20 = 0)
假如大大們有特殊需求,遇到需要這樣比較的情況
例如:
搜尋欄位不確定是整數還是字串型態
又不想要有誤判的情況
可以另外使用length來比較,只是效能一定會減分
select (20 = "20XXX" and length(20) = length("20XXX") ) ;
【更新】
比較方法還可以使用 @純真的人 大大的binary方式
select * from transactions where binary id = "20xxx";
原理可以看 @fysh711426 大大的解說
研究了一下 binary 的原理,
一開始以為因為 id 被轉型成二進制,
所以後面的字串才沒有被隱轉成 int,不過不是很確定,所以 Google 了型態轉換的優先順序,
發現原來 binary 是字串型態的一種,所以並不如我所想,而是字串和字串比對本來就不用轉型成 int。
SELECT BINARY 20 = '20' --1
BINARY
等同CAST(str AS BINARY)
會將 int 轉型成字串。發現不小心自言自語了一大串。
我試這個方式可以@@判斷...加上binary
select * from transactions where binary id = "20xxx";
研究了一下 binary 的原理,
一開始以為因為 id 被轉型成二進制,
所以後面的字串才沒有被隱轉成 int,
不過不是很確定,所以 Google 了型態轉換的優先順序,
發現原來 binary 是字串型態的一種,所以並不如我所想,而是字串和字串比對本來就不用轉型成 int。
SELECT BINARY 20 = '20' --1
BINARY
等同 CAST(str AS BINARY)
會將 int 轉型成字串。
發現不小心自言自語了一大串。
長知識 + 1
找到 MySql 文檔
Type Conversion in Expression Evaluation
雖然現在沒在用MySQL,
不過如果以後同事遇到就不會覺得驚訝了XD
我也沒有在用~~哈
只是有特別需要~才去查去資料XD
第一次發現這件事,
不過我倒是不會去做數字跟字串比較這件事...
恩~因基本在傳值過來的時候~
就會先判斷值是否為數值資料了~(防呆+防攻擊)